/*******************************************************************************
 * Copyright (c) 2012-2017 Codenvy, S.A.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Codenvy, S.A. - initial API and implementation
 *******************************************************************************/
package org.eclipse.che.ide.ext.git.client.preference;

import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.inject.Inject;
import com.google.inject.Singleton;

import org.eclipse.che.ide.api.preferences.AbstractPreferencePagePresenter;
import org.eclipse.che.ide.api.preferences.PreferencesManager;
import org.eclipse.che.ide.ext.git.client.GitLocalizationConstant;

/**
 * Preference page presenter for the information about git committer.
 *
 * @author Valeriy Svydenko */
@Singleton
public class CommitterPreferencePresenter extends AbstractPreferencePagePresenter implements CommitterPreferenceView.ActionDelegate {

    public static final String COMMITTER_NAME  = "git.committer.name";
    public static final String COMMITTER_EMAIL = "git.committer.email";

    private CommitterPreferenceView view;
    private PreferencesManager      preferencesManager;
    private boolean dirty = false;
    private String name;
    private String email;


    @Inject
    public CommitterPreferencePresenter(CommitterPreferenceView view,
                                        GitLocalizationConstant constant,
                                        PreferencesManager preferencesManager) {
        super(constant.committerTitle(), constant.committerPreferenceCategory());
        this.view = view;
        this.preferencesManager = preferencesManager;

        name = preferencesManager.getValue(COMMITTER_NAME);
        email = preferencesManager.getValue(COMMITTER_EMAIL);

        view.setDelegate(this);
    }

    /** {@inheritDoc} */
    @Override
    public boolean isDirty() {
        return dirty;
    }

    /** {@inheritDoc} */
    @Override
    public void go(AcceptsOneWidget container) {
        container.setWidget(view);

        view.setName(name);
        view.setEmail(email);
    }

    /** {@inheritDoc} */
    @Override
    public void nameChanged(String name) {
        this.name = name;
        dirty = !name.equals(preferencesManager.getValue(COMMITTER_NAME));
        delegate.onDirtyChanged();
    }

    /** {@inheritDoc} */
    @Override
    public void emailChanged(String email) {
        this.email = email;
        dirty = !email.equals(preferencesManager.getValue(COMMITTER_EMAIL));
        delegate.onDirtyChanged();
    }

    /** {@inheritDoc} */
    @Override
    public void storeChanges() {
        preferencesManager.setValue(COMMITTER_NAME, name);
        preferencesManager.setValue(COMMITTER_EMAIL, email);

        dirty = false;
    }

    /** {@inheritDoc} */
    @Override
    public void revertChanges() {
        name = preferencesManager.getValue(COMMITTER_NAME);
        email = preferencesManager.getValue(COMMITTER_EMAIL);

        view.setName(name);
        view.setEmail(email);

        dirty = false;
    }

}
